<?php
namespace trade\common;

class DBTool{
    private static $_redissn = 0;//Slave 句柄标记
    public  static $_redislinks = [
        'master' => null,// 只支持一台 Master
        'slave' => [],// 可以有多台 Slave
    ];

    /**
     * 连接服务器,注意：这里使用长连接，提高效率，但不会自动关
     * @param array $config Redis服务器配置
     * @param boolean $isMaster 当前添加的服务器是否为 Master 服务器
     * @return boolean
     **/
    public static function initRedis($config = ['host' => '127.0.0.1', 'port' => 6379], $isMaster = true)
    {
        if ($isMaster) {
            if (!empty(static::$_redislinks['master'])) {
                static::$_redislinks['master']->close();
            }
            static::$_redislinks['master'] = new \Redis();
            static::$_redislinks['master']->pconnect($config['host'], $config['port']);
            return static::$_redislinks['master'];
        } else {
            static::$_redissn++;
            static::$_redislinks['slave'][static::$_redissn] = new \Redis();
            static::$_redislinks['slave'][static::$_redissn]->pconnect($config['host'], $config['port']);
            return static::$_redislinks['slave'][static::$_redissn];
        }
    }

    /**
     * 关闭连接
     * @param int $flag 关闭选择 0:关闭 Master 1:关闭 Slave 2:关闭所有
     * @return boolean
     **/
    public static function closeRedis($flag = 3)
    {
        if ($flag == 0) {
            static::$_redislinks['master']->close();
        } else if ($flag == 2) {
            foreach (static::$_redislinks['slave'] as $slave) {
                $slave->close();
            }
            static::$_redislinks['slave'] = [];
        } else {
            static::$_redislinks['master']->close();
            foreach (static::$_redislinks['slave'] as $slave) {
                $slave->close();
            }
            static::$_redislinks['slave'] = [];
        }
    }

    /**
     * 得到 Redis 原始对象可以有更多的操作
     *
     * @param boolean $isMaster 返回服务器的类型 true:返回Master false:返回Slave
     * @param boolean $slaveOne 返回的Slave选择 true:负载均衡随机返回一个Slave选择 false:返回所有的Slave选择
     * @return redis object
     **/
    public static function redis($isMaster = false, $slaveOne = true)
    {
        if ($isMaster) {
            return static::$_redislinks['master'];
        } else {
            if ($slaveOne) {
                return empty(static::$_redislinks['slave'])?static::$_redislinks['master']:static::$_redislinks['slave'][rand(1,static::$_redissn)];
            } else {
                return static::$_redislinks['slave'];
            }
        }
    }
}